bitkeeper revision 1.853 (407282d3tJwEyg57cPIuOEErciWHgA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 6 Apr 2004 10:13:39 +0000 (10:13 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 6 Apr 2004 10:13:39 +0000 (10:13 +0000)
Port missing file updates from Linux 2.4.25.

xen/arch/i386/io_apic.c

index 4cec08fc22e32356725275293c5de60147c8c924..3f0c81be7a2621945cc3111d8dba8d88b2f82205 100644 (file)
@@ -937,6 +937,7 @@ void __init print_IO_APIC(void)
        printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.version);
        if (    (reg_01.version != 0x01) && /* 82489DX IO-APICs */
                (reg_01.version != 0x02) && /* VIA */
+               (reg_01.version != 0x03) && /* later VIA */
                (reg_01.version != 0x10) && /* oldest IO-APICs */
                (reg_01.version != 0x11) && /* Pentium/Pro IO-APICs */
                (reg_01.version != 0x13) && /* Xeon IO-APICs */
@@ -946,13 +947,31 @@ void __init print_IO_APIC(void)
        if (reg_01.__reserved_1 || reg_01.__reserved_2)
                UNEXPECTED_IO_APIC();
 
-       if (reg_01.version >= 0x10) {
+       /*
+        * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
+        * but the value of reg_02 is read as the previous read register
+        * value, so ignore it if reg_02 == reg_01.
+        */
+       if (reg_01.version >= 0x10 && *(int *)&reg_02 != *(int *)&reg_01) {
                printk(KERN_DEBUG ".... register #02: %08X\n", *(int *)&reg_02);
                printk(KERN_DEBUG ".......     : arbitration: %02X\n", reg_02.arbitration);
                if (reg_02.__reserved_1 || reg_02.__reserved_2)
                        UNEXPECTED_IO_APIC();
        }
 
+       /*
+        * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
+        * or reg_03, but the value of reg_0[23] is read as the previous read
+        * register value, so ignore it if reg_03 == reg_0[12].
+        */
+       if (reg_01.version >= 0x20 && *(int *)&reg_03 != *(int *)&reg_02 &&
+           *(int *)&reg_03 != *(int *)&reg_01) {
+               printk(KERN_DEBUG ".... register #03: %08X\n", *(int *)&reg_03);
+               printk(KERN_DEBUG ".......     : Boot DT    : %X\n", reg_03.boot_DT);
+               if (reg_03.__reserved_1)
+                       UNEXPECTED_IO_APIC();
+       }
+
        printk(KERN_DEBUG ".... IRQ redirection table:\n");
 
        printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"